package com.scau402.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.scau402.common.annotation.DataScope;
import com.scau402.common.constant.DeptConstants;
import com.scau402.common.constant.InboundConstants;
import com.scau402.common.constant.JadeConstants;
import com.scau402.common.core.domain.entity.SysUser;
import com.scau402.common.utils.DateUtils;
import com.scau402.common.utils.SecurityUtils;
import com.scau402.common.utils.StringUtils;
import com.scau402.common.utils.code.JadeCodeUtils;
import com.scau402.system.domain.SysTenant;
import com.scau402.system.domain.WmsInboundOrder;
import com.scau402.system.domain.WmsJade;
import com.scau402.system.mapper.WmsJadeMapper;
import com.scau402.system.service.ISysTenantService;
import com.scau402.system.service.IWmsJadeFeatureService;
import com.scau402.system.service.IWmsJadeImageService;
import com.scau402.system.service.IWmsJadeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 单个翡翠信息Service业务层处理
 *
 * @author ruoyi
 * @date 2023-06-26
 */
@Service
public class WmsJadeServiceImpl extends ServiceImpl<WmsJadeMapper, WmsJade> implements IWmsJadeService
{
    @Autowired
    private WmsJadeMapper wmsJadeMapper;

    @Autowired
    private IWmsJadeFeatureService wmsJadeFeatureService;

    @Autowired
    private ISysTenantService tenantService;


    /**
     * 查询单个翡翠信息
     *
     * @param id 单个翡翠信息主键
     * @return 单个翡翠信息
     */
    @Override
    public WmsJade selectWmsJadeById(Long id) {
        return wmsJadeMapper.selectWmsJadeById(id);
    }

    /**
     * 查询单个翡翠信息列表
     *
     * @param wmsJade 单个翡翠信息
     * @return 单个翡翠信息
     */
    @Override
    @DataScope(tenantAlias = "t", userAlias = "u")
    public List<WmsJade> selectWmsJadeList(WmsJade wmsJade)
    {
        wmsJade.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        return wmsJadeMapper.selectWmsJadeList(wmsJade);
    }

    /**
     * 新增单个翡翠信息
     *
     * @param wmsJade 单个翡翠信息
     * @return 结果
     */
    @Override
    public int insertWmsJade(WmsJade wmsJade)
    {
        wmsJade.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        wmsJade.setCreateTime(DateUtils.getNowDate());
        wmsJade.setDeptId(DeptConstants.DEPT_ID_DEFAULT);
        return wmsJadeMapper.insertWmsJade(wmsJade);
    }

    /**
     * 修改单个翡翠信息
     *
     * @param wmsJade 单个翡翠信息
     * @return 结果
     */
    @Override
    public int updateWmsJade(WmsJade wmsJade)
    {
        wmsJade.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        wmsJade.setUpdateTime(DateUtils.getNowDate());
        return wmsJadeMapper.updateWmsJade(wmsJade);
    }

    /**
     * 批量删除单个翡翠信息
     *
     * @param ids 需要删除的单个翡翠信息主键
     * @return 结果
     */
    @Override
    public int deleteWmsJadeByIds(Long[] ids)
    {
        return wmsJadeMapper.deleteWmsJadeByIds(ids);
    }

    /**
     * 删除单个翡翠信息信息
     *
     * @param id 单个翡翠信息主键
     * @return 结果
     */
    @Override
    public int deleteWmsJadeById(Long id)
    {
        return wmsJadeMapper.deleteWmsJadeById(id);
    }

    @Override
    public String getMaxCode(SysUser user) {
        Long tenantId = user.getTenantId();
        String userCode = user.getUserCode();
        userCode = userCode.substring(1);
        Map<String, Object> params = new HashMap<>();
        // 设置参数值
        params.put("tenantId", tenantId);
        params.put("userCode", userCode);
        return wmsJadeMapper.getMaxCode(params);
    }

    @Override
    public String getJadeCode(String loginUserTenantCode, String userCode) {
        JadeCodeUtils jadeCodeUtils = new JadeCodeUtils();
        return JadeCodeUtils.getNewCode(loginUserTenantCode, userCode);
    }

    @Override
    public List<Long> selectInstockJadeImageIdList(Long tenantId) {
        return wmsJadeMapper.getInstockJadeImageIdList(tenantId);
    }

    @Override
    public List<WmsJade> selectInboundJadeList(Long tenantId) {
        return wmsJadeMapper.selectInboundJadeList(tenantId);
    }

    @Override
    public List<WmsJade> selectJadesByImageIds(List<Long> imageIds) {
        return wmsJadeMapper.selectJadesByImageIds(imageIds);
    }

    public int selectJadesByJadeCode(WmsJade jade) {
        return wmsJadeMapper.selectWmsJadeByJadeCode(jade);
    }

    @Override
    public String getNewCode(SysUser user) {
        // 获取数据库中最大的编码
        String maxCode = getMaxCode(user);

        String userCode = user.getUserCode();

        // 返回maxCode为NULL，及当前数据库没有数据，从0开始
        if(StringUtils.isNull(maxCode)) {
            maxCode = InboundConstants.MAX_CODE_ZERO;
        }

        // 获取当前用户所属租户编码
        Long loginUserTenantId = SecurityUtils.getLoginUser().getTenantId();

        SysTenant tenant = tenantService.selectSysTenantByTenantId(loginUserTenantId);

        String loginUserTenantCode = tenant.getTenantCode();

        JadeCodeUtils jadeCodeUtils = new JadeCodeUtils();

        // 设置redis的当前编码
        jadeCodeUtils.setCurrentCodeToMax(maxCode, loginUserTenantCode, userCode);

        return getJadeCode(loginUserTenantCode, userCode);
    }

    @Override
    public void insertJades(WmsInboundOrder wmsInboundOrder, String orderCode) throws InterruptedException {
        List<WmsJade> jades = wmsInboundOrder.getJades();
        for(WmsJade jade : jades) {
            jade.setOrderCode(orderCode);
            if((wmsInboundOrder.getCodeRule() != null) && (wmsInboundOrder.getCodeRule().equals(JadeConstants.CODE_RULE_INCR))) {
                jade.setJadeCode(getNewCode(SecurityUtils.getLoginUser().getUser()));
            }
            insertWmsJade(jade);
        }
    }

    @Override
    public boolean checkJadeExist(List<WmsJade> jades) {
        for(WmsJade jade : jades) {
            jade.setTenantId(SecurityUtils.getLoginUser().getTenantId());
            // TODO  2023/12/23 14:48: 逻辑是不是有问题
            if(wmsJadeMapper.selectWmsJadeByJadeCode(jade) != JadeConstants.JADE_NOT_EXIST) {
                return true;
            }
        }
        return false;
    }

    @Override
    public List<WmsJade> selectJadesByOrderCode(WmsInboundOrder inboundOrder) {
        inboundOrder.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        return wmsJadeMapper.selectWmsJadeByOrderCode(inboundOrder);
    }

    @Override
    public List<WmsJade> setNewReturnQuantity(WmsInboundOrder wmsInboundOrder) {
        List<WmsJade> jades = wmsInboundOrder.getJades();
        for(WmsJade jade : jades) {
            // 借货入库货品
            // 设置已还货数量，初始为0
            // 设置未还货数量，初始为翡翠数量
            if(jade.getOrderType().equals(InboundConstants.INBOUND_ORDER_TYPE_BORROW)) {
                jade.setReturnQuantity(InboundConstants.INBOUND_RETURN_QUANTITY_DEFAULT);
                jade.setNotReturnQuantity(jade.getJadeQuantity());
            }
            // 采购入库货品
            // 设置已还货数量，初始为0
            // 设置未还货数量，初始为0
            if(jade.getOrderType().equals(InboundConstants.INBOUND_ORDER_TYPE_BUY)) {
                jade.setReturnQuantity(InboundConstants.INBOUND_RETURN_QUANTITY_DEFAULT);
                jade.setNotReturnQuantity(InboundConstants.INBOUND_NOT_RETURN_QUANTITY_DEFAULT);
            }
        }
        return jades;
    }


    @Override
    public WmsJade selectWmsJadeByIdNew(Long id) {
        return wmsJadeMapper.selectWmsJadeByIdNew(id);
    }

    public void updateJadeStatus(String status, Long... ids) {
        wmsJadeMapper.update(
                null,
                new LambdaUpdateWrapper<WmsJade>()
                        .in(WmsJade::getId, Arrays.asList(ids))
                        .set(WmsJade::getStatus, status)
        );
    }
}
